package com.qianfeng.excel.listeners;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.qianfeng.excel.pojo.PersonData;
import com.qianfeng.excel.pojo.ProvinceCode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.stream.Collectors;

/**
 * Created by Jackiechan on 2022/4/24 0:33
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class ExcelListener extends AnalysisEventListener<PersonData> {
    private List<String> firstHeaders;
   public static boolean isFirstHead = true;
    private  static  ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,
            10,
            120,
            TimeUnit.SECONDS,
            new LinkedBlockingDeque<>(20),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );

    //一行一行读取excel内容
    private List<PersonData> allData = new ArrayList<>();

    private Map<String, PersonData> personDataMap = new HashMap<>();//

    public Map<String, PersonData> getPersonDataMap() {
        return personDataMap;
    }

    @Override
    public void invoke(PersonData data, AnalysisContext analysisContext) {
        //设置组合地址,方便后面直接使用
        CompletableFuture.runAsync(() -> {
            data.setFangzizonghedizhi(data.getBuildingNum() + "号楼" + data.getDanyuan() + "单元" + data.getMenhao() + "室");
            //根据用户的身份证号查找对应的省
            String province = ProvinceCode.getProvince(data.getShenfenzheng());
            if (province != null) {
                data.setSheng(province);
            }

            allData.add(data);
        }, executor);
    }
    //读取表头内容
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头："+headMap);
        if (isFirstHead) {
            isFirstHead = !isFirstHead;
            firstHeaders = headMap.values().stream().filter(s -> s != null).collect(Collectors.toList());
        }
    }
    //读取完成之后
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //将所有数据以地址为key,所有人为value保存到map中
        Map<String, List<PersonData>> allPersonDataMap  = allData.stream().
                collect(Collectors.toMap(PersonData::getFangzizonghedizhi,
                        personData -> {
                    //当没有对应key的数据的时候返回什么数据
                            if (firstHeaders != null && firstHeaders.size() >= 4) {
                                personData.setSuoshushequ(firstHeaders.get(1));
                                personData.setXiaoqumingcheng(firstHeaders.get(3));
                            }
            ArrayList<PersonData> arrayList = new ArrayList<>();
            arrayList.add(personData);
            return arrayList;
        }, (list1, list2) -> {
                    //当数据出现重复冲突的时候将数据保存到一起
            list1.addAll(list2);
            return list1;
        }));
        //拿到所有的房主
        List<PersonData> masterList = allData.stream().filter(personData -> "F".equalsIgnoreCase(personData.getFangbiao())).collect(Collectors.toList());

        //遍历房主
        masterList.forEach(personData -> {
            //获取所有的住户
            List<PersonData> zhuhuList = personData.getZhuhuList();
            if (zhuhuList == null) {
                zhuhuList = new ArrayList<>();
                personData.setZhuhuList(zhuhuList);
            }
            //获取所有在房子里面的人
            List<PersonData> dataList = allPersonDataMap.get(personData.getFangzizonghedizhi());
            List<PersonData> finalZhuhuList = zhuhuList;
            //将住户保存到房主上面
            dataList.forEach(personData1 -> {
                //如果是租户或者是房主和家人住一起
                if ("R".equalsIgnoreCase(personData1.getRenbiao()) || !personData1.getXingming().equalsIgnoreCase(personData.getXingming())) {
                    //给住户设置房主
                    //personData1.setFangzhu(personData);
                    personData1.setChanquanrenmingzi(personData.getXingming());
                    personData1.setChanquanrenhaoma(personData.getDianhua());
                    personData1.setChanquanrenhuji(personData.getHuji());
                    personData1.setChanquanrenzhengjian(personData.getShenfenzheng());
                    personData1.setChangzhuleixing(personData.getChangzhuleixing());
                    personData1.setBuildingNum(personData.getBuildingNum());
                    personData1.setDanyuan(personData.getDanyuan());
                    personData1.setMenhao(personData.getMenhao());
                    personData1.setMianji(personData.getMianji());
                    personData1.setHuxing(personData.getHuxing());
                    personData1.setChanquanleixing(personData.getChanquanleixing());
                    personData1.setYongtu(personData.getYongtu());
                    //给房主添加住户
                    finalZhuhuList.add(personData1);
                }
            });
            //最后以地址作为key,将房主保存起来,所有的住户都绑定到了房主上面
            personDataMap.put(personData.getFangzizonghedizhi(), personData);
        });

        System.err.println(personDataMap);
    }

}
